/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOS_STL_POOL_ITEM_LIST_H__
#define __XOS_STL_POOL_ITEM_LIST_H__

#include "fake_lock.h"
#include <list>

namespace xos_stl
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
	// 直接继承，再加池需要的几个方法
	// 

	template< class T, class ListLock = fake_lock >
    class item_list : public std::list< T* >
    {
	public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
		typedef ListLock LIST_LOCK;
		typedef item_list< T, LIST_LOCK > LIST;
		typedef typename LIST::const_iterator CONST_ITER;
		typedef typename LIST::iterator ITER;
        typedef std::list< T* > BASE;
	protected:
		LIST_LOCK m_lock;
    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        item_list() : BASE()
		{
		}
        ~item_list()
		{
            put_back_to_pool();
		}
    public:
        void for_each_item( f_item_operation<T> fProc )
        {
            for( ITER iter = BASE::begin(); iter != BASE::end(); )
            {
                T* pT = *iter++;
                fProc( pT );
            }
        }
	public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        void put_back_to_pool()
        {
            for_each_item( term_pool_item<T> );
            BASE::clear();
        }
        void release_all()
        {
            for_each_item( release_interface<T> );
            BASE::clear();
        }
        void delete_all()
        {
            for_each_item( term_obj<T> );
            BASE::clear();
        }
        void un_lock()
        {
            m_lock.un_lock();
        }
        void lock()
        {
            m_lock.lock();
        }
    };

} // xos_stl

#endif // __XOS_STL_POOL_ITEM_LIST_H__
